//***************************************************************************************

//              利用Shi-Tomasi算法实现角点检测-其中角点最大数量为120

//***************************************************************************************

#include "ImageDecMat.hpp"

void ImageDecMat::on_cornerDetector(cv::Mat Image1,cv::Mat& Image2)
{
    int ncorner_max=120;//角点最大数量
    //Shi-Tomasi算法的参数准备
    std::vector<cv::Point2f>corners;
    double qualityLevel=0.01;//角点检测可接受的最小特征
    double minDistance=10;//角点之间的最小距离
    int blockSize=3;//计算导数自相关矩阵时指定的邻域范围
    double k=0.04;//权重系数
    Image2=Image1.clone();//复制源图像到一个临时变量中，作为感兴趣区域
    //进行Shi-Tomasi角点检测
    goodFeaturesToTrack(Image1, corners, ncorner_max, qualityLevel, minDistance,cv::Mat(),blockSize,false,k);
    
    //输出文字信息
    std::cout<<">此次检测到的角点数量为："<<corners.size()<<std::endl;
    
    //亚像素角点检测的参数设置
    cv::Size winSize=cv::Size(5,5);
    cv::Size zeroZone=cv::Size(-1,-1);
    cv::TermCriteria criteria=cv::TermCriteria(cv::TermCriteria::EPS+cv::TermCriteria::MAX_ITER,400, 0.001);
    
    //计算出亚像素点角点位置
    cornerSubPix(Image1, corners, winSize, zeroZone, criteria);
    
    //输出角点信息
    for(int i=0;i<corners.size();++i)
    {
        std::cout<<"\t精确角点坐标["<<i<<"]("<<corners[i].x<<","<<corners[i].y<<")"<<std::endl;
    }
    //绘制检测到的角点
    int r=4;
    for(unsigned int i=0;i<corners.size();++i)
    {
        //以随机颜色绘制角点
        circle(Image2, corners[i], r, cv::Scalar(0,0,255),-1,8,0);
        
    }

}
